package cn.scnu.component;

import cn.hutool.core.util.StrUtil;
import cn.hutool.core.util.ZipUtil;
import cn.scnu.mapper.WBydataapplySwMapper;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;

import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CompletableFuture;

/**
 * TODO
 *
 * @author hqz
 * @className AsyncFun2
 * @createTime 2024年12月20日 17:38:00
 */
@Component
@Slf4j
@RequiredArgsConstructor
public class AsyncFun2 {

    private final AsyncFun asyncFun;

    @Value("${file.download.urlSuffix}")
    private String urlSuffix;

    private final WBydataapplySwMapper fromMapper;

    @Async("ASYNC_EXECUTOR")
    public void fileZipAndUpdateFormXzdzUrl(List<String> filePaths, String parentDir, String fromId) throws InterruptedException {
        // 线程休眠3秒
        Thread.sleep(3000);
        // 根据数据项获取数据存储地址，使用多线程进行压缩包处理
        log.info("根据数据项获取数据存储地址，使用多线程进行压缩包处理");
        List<CompletableFuture<String>> futures = new ArrayList<>();

        for (String file : filePaths) {
            // 处理压缩包，构建feature任务
            if (StrUtil.isNotBlank(file)) {
                futures.add(asyncFun.fileZip(file, parentDir));
            }
        }

        // 获取完成所有压缩任务的结果
        CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).join();

        File resZip = ZipUtil.zip(parentDir);
        String downloadUrl = StrUtil.format("{}{}", urlSuffix, resZip.getName());
        log.info("获取完成所有压缩任务的结果后，下载地址为：{}", downloadUrl);

        // 更新表单中的三维数据下载地址
        fromMapper.updateSwzxdzById(fromId, downloadUrl);
    }
}
